package cn.nvrelax.cloudnote.syskit;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.Map;

/**
 * 程序描述：登录后创建Token的工具类
 * 创建Token的工具类
 *     Payload默认的7个字段含义
 *     iss：发行人
 *     exp：到期时间
 *     sub：主题
 *     aud：用户
 *     nbf：在此之前不可用
 *     iat：发布时间
 *     jti：JWT ID用于标识该JWT
 *
 * 创建时间：2019/5/30 21:37
 * 编码：nvRelax
 */
@Component
public class TokenUtil {

    @Value("${cn.nvrelax.token.key}")
    private String encryptKey;
    @Value("${cn.nvrelax.token.generalTime}")
    private int generalAvailableTime;
    @Value("${cn.nvrelax.token.appTime}")
    private int appAvailableTime;

    /**
     * 签发一般Token，有效期 $generalTime
     * @param body 自定义字段内容
     * @return token
     */
    public String signToken(Map<String,Object> body) {
        return create(body, new Date(System.currentTimeMillis() + generalAvailableTime),null);
    }

    /**
     * 签发App端Token，有效期 $appTime
     * @param body 自定义字段内容
     * @return token
     */
    public String signAppToken(Map<String,Object> body) {
        return create(body, new Date(System.currentTimeMillis() + appAvailableTime),null);
    }

    /**
     * 签发指定时间过期的token
     * @param body 自定义字段内容
     * @param availableTime token可用时间 单位毫秒
     * @return token
     */
    public String signToken(Map<String,Object> body, int availableTime) {
        return create(body, new Date(System.currentTimeMillis() + availableTime),null);
    }

    private String create(Map<String,Object> claims, Date expDate, Date nbfDate) {
        Date now = new Date();
        return Jwts.builder()
                .signWith(SignatureAlgorithm.HS256,encryptKey)
                .addClaims(claims)
                .setIssuer("nvr")
                .setIssuedAt(now)
                .setExpiration(expDate)
                .setNotBefore(nbfDate)
                .setSubject("cloudnote")
                .compact();
    }


}
